package com.snopy.controller.center;

import com.snopy.common.JSONResult;
import com.snopy.controller.BaseController;
import com.snopy.pojo.Users;
import com.snopy.pojo.bo.center.CenterUserBO;
import com.snopy.resource.FileUploadConfig;
import com.snopy.service.center.CenterUserService;
import com.snopy.utils.CookieUtils;
import com.snopy.utils.DateUtil;
import com.snopy.utils.JsonUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author snopy
 * @version 1.0.0
 * @classname CenterUserController
 * @description
 * @email 77912204@qq.com
 * @date 2020/10/13 22:46
 */
@Api(value = "用户信息接口", tags = {"用户信息相关接口"})
@RestController
@RequestMapping("userInfo")
public class CenterUserController extends BaseController {

    @Autowired
    private CenterUserService centerUserService;

    @Autowired
    private FileUploadConfig fileUploadConfig;
    @ApiOperation(value = "修改用户信息", notes = "修改用户信息", httpMethod = "POST")
    @PostMapping("update")
    public JSONResult update(
            @ApiParam(name = "userId", value = "用户id", required = true)
            @RequestParam String userId,
            @RequestBody @Valid CenterUserBO centerUserBO,
            BindingResult result,
            HttpServletRequest request, HttpServletResponse response) {

        // 判断BindingResult是否保存错误的验证信息，如果有，则直接return
        if (result.hasErrors()) {
            Map<String, String> errorMap = getErrors(result);
            return JSONResult.errorMap(errorMap);
        }

        Users userResult = centerUserService.updateUserInfo(userId, centerUserBO);

        setNullProperty(userResult);
        CookieUtils.setCookie(request, response, "user",
                JsonUtils.objectToJson(userResult), true);

        // TODO 后续要改，增加令牌token，会整合进redis，分布式会话

        return JSONResult.ok();
    }
    private Map<String, String> getErrors(BindingResult result) {
        Map<String, String> map = new HashMap<>();
        List<FieldError> errorList = result.getFieldErrors();
        for (FieldError error : errorList) {
            // 发生验证错误所对应的某一个属性
            String errorField = error.getField();
            // 验证错误的信息
            String errorMsg = error.getDefaultMessage();

            map.put(errorField, errorMsg);
        }
        return map;
    }
    private void setNullProperty(Users userResult) {
        userResult.setPassword(null);
        userResult.setMobile(null);
        userResult.setEmail(null);
        userResult.setCreatedTime(null);
        userResult.setUpdatedTime(null);
        userResult.setBirthday(null);
    }



    @ApiOperation(value = "头像上传", notes = "头像上传", httpMethod = "POST")
    @PostMapping("uploadFace")
    public JSONResult uploadFace(
            @ApiParam(name = "userId", value = "用户id", required = true)
            @RequestParam String userId,
            @ApiParam(name = "file",value = "文件",required = true)
            MultipartFile file,
            HttpServletRequest request, HttpServletResponse response) {

        //定义头像保存位置
        //String fileSpace = IMAGE_USER_FACE_LOCATION;
        String fileSpace = fileUploadConfig.getImageUserFaceLocation();
        //在路径上为每一个用户增加一个userid，用于区分不同用户的上传
        String uploadPathPrefix = File.separator+userId;

        //开始文件上传
        if (file!=null) {
            // 获得文件上传的文件名称
            String fileName = file.getOriginalFilename();
            FileOutputStream outputStream = null;
            try {
            if (StringUtils.isNotEmpty(fileName)){
                //文件名重组 snopy-face.png -> ["snopy-face","png"]
                String[] fileNameArr = fileName.split("\\.");
                // 获取文件的后缀名
                String suffix = fileNameArr[fileNameArr.length-1];
                
                //图片格式限制
                if (!suffix.equalsIgnoreCase("png") &&
                        !suffix.equalsIgnoreCase("jpg") &&
                        !suffix.equalsIgnoreCase("jpeg") ) {
                    return JSONResult.errorMsg("图片格式不正确！");
                }
                // face-{userid}.png
                // 文件名称重组 覆盖式上传，增量式：额外拼接当前时间
                String newFileName = "face-"+userId+"."+suffix;

                // 上传的头像最终保存的位置

                String finalFacePath = fileSpace + uploadPathPrefix + File.separator + newFileName;
                // 用于提供给web服务访问的地址
                uploadPathPrefix += ("/" + newFileName);
                File outFile = new File(finalFacePath);
                if (outFile.getParentFile()!=null){
                    //创建文件夹
                    boolean mkdirs = outFile.getParentFile().mkdirs();
                    if (!mkdirs){
                        return JSONResult.errorMsg("头像上传失败！");
                    }
                }
                //文件输出到保存目录
                outputStream = new FileOutputStream(outFile);
                InputStream inputStream = file.getInputStream();
                IOUtils.copy(inputStream,outputStream);
            }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (outputStream!=null){
                    try {
                        outputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }else {
            return JSONResult.errorMsg("文件不可为空！");
        }

        // 获取图片服务地址
        String imageServerUrl = fileUploadConfig.getImageServerUrl();
        // 由于浏览器可能存在缓存的情况，所以在这里，我们需要加上时间戳来保证更新后的图片可以及时刷新
        String finalUserFaceUrl = imageServerUrl + uploadPathPrefix
                + "?t=" + DateUtil.getCurrentDateString(DateUtil.DATE_PATTERN);

        // 更新用户头像到数据库
        Users userResult = centerUserService.updateUserFace(userId, finalUserFaceUrl);

        setNullProperty(userResult);
        CookieUtils.setCookie(request, response, "user",
                JsonUtils.objectToJson(userResult), true);
        // TODO 后续要改，增加令牌token，会整合进redis，分布式会话
        return JSONResult.ok();
    }
}
